﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using Badge_Manager.Model;

namespace Badge_Manager.Controller
{
    public class ctrlStanza
    {
        Connector Connessione = Connector.Istance();

        public enum AulaImpegnata
        {
            Impegnata,
            Libera
        }

        public int InserisciStanza(Stanza stanza)
        {
            if (stanza != null)
            {
                Connessione = Connector.Istance();
                SqlCommand insert = new SqlCommand("insert into Stanze values(@id,@capienza,@numero)", Connessione.Connessione);

                SqlParameter id = new SqlParameter();
                id.ParameterName = "@id";
                id.SqlDbType = SqlDbType.UniqueIdentifier;
                id.Value = stanza.Id;
                insert.Parameters.Add(id);

                SqlParameter capienza = new SqlParameter();
                capienza.ParameterName = "@capienza";
                capienza.SqlDbType = SqlDbType.Int;
                capienza.Value = stanza.Capienza;
                insert.Parameters.Add(capienza);

                SqlParameter numero = new SqlParameter();
                numero.ParameterName = "@numero";
                numero.SqlDbType = SqlDbType.Int;
                numero.Value = stanza.Numero;
                insert.Parameters.Add(numero);
                try
                {
                    return insert.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    MessageBox.Show("Errore :" + ex.Message);
                }
            }
            return 0;
        }

        public void UpdateStanza(Stanza stanza)
        {
            if (stanza != null)
            {
                Connessione = Connector.Istance();
                SqlCommand update = new SqlCommand("update Stanze set capienza = @capienza,numero = @numero where id = @id ", Connessione.Connessione);

                SqlParameter id = new SqlParameter();
                id.ParameterName = "@id";
                id.SqlDbType = SqlDbType.UniqueIdentifier;
                id.Value = stanza.Id;
                update.Parameters.Add(id);

                SqlParameter capienza = new SqlParameter();
                capienza.ParameterName = "@capienza";
                capienza.SqlDbType = SqlDbType.Int;
                capienza.Value = stanza.Capienza;
                update.Parameters.Add(capienza);

                SqlParameter numero = new SqlParameter();
                numero.ParameterName = "@numero";
                numero.SqlDbType = SqlDbType.Int;
                numero.Value = stanza.Numero;
                update.Parameters.Add(numero);

                try
                {
                    update.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    MessageBox.Show("Errore : " + e.Message);
                }
            }
        }

        public List<Stanza> SelectAll()
        {
            Connessione = Connector.Istance();
            SqlDataAdapter view = new SqlDataAdapter(
                "Select id,numero as Numero,capienza as Capienza from Stanze order by numero", Connessione.Connessione);
            DataTable dt = new DataTable();
            view.Fill(dt);
            List<Stanza> stanze = new List<Stanza>();
            foreach (DataRow dr in dt.Rows)
                stanze.Add(new Stanza
                {
                    Id = (Guid)dr["id"],
                    Capienza = (int)dr["Capienza"],
                    Numero = (int)dr["Numero"]
                });
            return stanze;
        }

        public DataTable SelectAll(string query)
        {
            Connessione = Connector.Istance();
            SqlDataAdapter view = new SqlDataAdapter(query, Connessione.Connessione);
            DataTable dt = new DataTable();
            view.Fill(dt);
            return dt;
        }

        public void EliminaStanza(Guid id)
        {
            Connessione = Connector.Istance();
            SqlCommand cmd = new SqlCommand("delete from Stanze where id = '" + id + "'", Connessione.Connessione);
            try
            {
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                if (ex.Number == 547)
                    throw new StanzaAssociataAdAttivita();
            }
        }

        public Stanza GetStanzaById(Guid id)
        {
            Stanza stanza = new Stanza();
            DataTable dt = new DataTable();
            Connessione = Connector.Istance();
            SqlDataAdapter select = new SqlDataAdapter("Select * from Stanze where id = '" + id + "'", Connessione.Connessione);
            select.Fill(dt);
            stanza.Id = id;
            stanza.Numero = (int)dt.Rows[0]["numero"];
            stanza.Capienza = (int)dt.Rows[0]["capienza"];
            return stanza;
        }

        /// <summary>
        /// Seleziona tutte le aule impegnate in corsi
        /// </summary>
        /// <returns>Una lista di Attivita</returns>
        public List<Attivita> SelezionaAuleImpegnate(AulaImpegnata Selezione, Stanza Stanza)
        {
            string sql = @"SELECT Stanze.id AS IdStanza, Stanze.capienza AS Capienza, Stanze.numero AS Aula
                ,Corsi.id AS IdCorso,Corsi.codice, Corsi.datainizio AS DataCorso, Corsi.numeroore, Corsi.nome, Corsi.id AS IdCorso
                FROM Attivita INNER JOIN
                Corsi ON Attivita.idcorso = Corsi.id INNER JOIN ";

            if (Selezione == AulaImpegnata.Impegnata)
                //l'attivita non è ancora finita
                sql += "Stanze ON Attivita.idstanza = '" + Stanza.Id + "' and Corsi.datafine >= '" + DateTime.Today + "'";
            else
                //l'attività è finita
                sql += "Stanze ON Attivita.idstanza = '" + Stanza.Id + "' and Corsi.datafine <= '" + DateTime.Today + "'";

            SqlDataAdapter com = new SqlDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);

            List<Attivita> lstRitorno = new List<Attivita>();
            foreach (DataRow row in dt.Rows)
            {
                Attivita attivita = new Attivita();
                attivita.Corso = new Corso()
                {
                    Id = (Guid)row["IdCorso"],
                    Nome = row["nome"].ToString(),
                    Codice = row["codice"].ToString(),
                    NumeroOre = Convert.ToInt16(row["numeroore"]),
                    DataInizio = (DateTime)row["DataCorso"]
                };
                attivita.Stanza = new Stanza()
                {
                    Id = (Guid)row["IdStanza"],
                    Capienza = Convert.ToInt16(row["Capienza"]),
                    Numero = Convert.ToInt16(row["Aula"])
                };
                lstRitorno.Add(attivita);
            }
            return lstRitorno;
        }

        /// <summary>
        /// Restituisce un boolean se la stanza in quel periodo è impegnata
        /// </summary>
        /// <param name="idaula"></param>
        /// <param name="Inizio"></param>
        /// <param name="Fine"></param>
        /// <returns>Restituisce un valore booleano</returns>
        public bool SelezionaAuleImpegnate(Guid idaula,
            DateTime Inizio, DateTime Fine)
        {
            string sql = @"SELECT Stanze.id AS IdAula, Stanze.capienza AS Capienza, Stanze.numero AS Numero
                ,Corsi.datainizio AS InizioCorso, Corsi.numeroore AS Ore, Corsi.nome AS Corso, Corsi.id AS IdCorso
                FROM Attivita LEFT OUTER JOIN
                Corsi ON Attivita.idcorso = Corsi.id LEFT OUTER JOIN
                Stanze ON Attivita.idstanza = Stanze.id
                WHERE (Corsi.datainizio BETWEEN '" + Inizio + "' and '" + Fine + "') AND (Stanze.id = '" + idaula + "')";
            SqlDataAdapter com = new SqlDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            if (dt.Rows.Count > 0)
                return true;
            else
                return false;
        }

        public Stanza GetStanzaByNumero(int i)
        {
            Stanza stanza = new Stanza();
            DataTable data = new DataTable();
            Connessione = Connector.Istance();
            SqlDataAdapter select = new SqlDataAdapter("Select * from Stanze where numero = '" + i + "'", Connessione.Connessione);
            select.Fill(data);
            if (data.Rows.Count > 0)
            {
                stanza.Id = (Guid)data.Rows[0]["id"];
                stanza.Numero = (int)data.Rows[0]["numero"];
                stanza.Capienza = (int)data.Rows[0]["capienza"];
            }
            return stanza;
        }
    }
}